// interface 接口
// 一般情况下，通过 interface 来定义对象类型

// 自己定义的类型，首字母一般大写
interface Person {
  readonly id: number; // 只读必选属性
  name: string; // 必选属性
  age: number; // 必选属性
  sex?: string; // 可选属性
  [key: string]: any; // 任意属性
}

const person: Person = {
  id: 1,
  name: "jack",
  age: 18,
  sex: "男",
};

console.log(person.name); // 'jack'
person.name = "tom";
console.log(person.name); // 'tom'

console.log(person.id);
// person.id++; // 报错，只读属性不能修改

// 可以使用 interface 重复定义同样名称的类型
// 声明合并。将两个同样名称类型合并成一个类型
interface Cat {
  category: string;
}
interface Cat {
  readonly id: number; // 只能添加新的，不能修改旧的
}
// 等价于
// interface Cat {
//   readonly id: number;
//   category: string;
// }

const cat1: Cat = {
  id: 1,
  category: "加菲",
};
